// utils/request.ts

import { BaseUrl } from "../constans/index";
import { loginSystem } from "./util";

interface RequestOptions extends WechatMiniprogram.RequestOption {
  // 可以扩展其他字段，比如额外的配置
}


/**http状态码 */
export enum HTTP_CODE {
  /**成功 */
  success,
  /**服务器错误 */
  error,
  /**未注册 */
  unregistered,
  /**token过期 */
  tokenExpiration,
}

export interface ResponseSuccess<T = any> {
  // 假设所有接口都返回一个类似的结构，可以根据实际情况修改
  success: true;
  code: number;
  data: T;
}

export interface ResponseError {
  // 假设所有接口都返回一个类似的结构，可以根据实际情况修改
  success: false;
  code: number;
  msg: string;
}

/**请求拦截器 */
const requestInterceptor = (options: RequestOptions): RequestOptions => {
  // 在这里处理请求前的逻辑，比如添加 Token 等
  if (!options.header) {
    options.header = {};
    options.url = BaseUrl + options.url
  }

  // 假设你将 token 存储在 storage 中
  const token = wx.getStorageSync('token');
  if (token) {
    options.header['Authorization'] = `Bearer ${token}`;  // 添加 Token
  }

  // 可以在这里做一些全局 loading 处理
  // wx.showLoading({
  //   title: '加载中...',
  //   mask: true,
  // });

  return options;
};
/**响应拦截器 */
const responseInterceptor = (res: WechatMiniprogram.RequestSuccessCallbackResult): any => {
  // wx.hideLoading();

  // if (res.statusCode !== 200) {
  //   // 这里可以处理请求失败的情况，比如提示用户
  //   wx.showToast({
  //     title: '请求失败，请稍后重试',
  //     icon: 'none',
  //   });
  //   return Promise.reject(res);  // 请求失败，返回错误
  // }


  if ((res.data as any).code === HTTP_CODE.tokenExpiration) {
    loginSystem()
  }

  return res.data;  // 返回请求的数据部分
};

const request = (options: RequestOptions): Promise<any> => {
  const interceptedOptions = requestInterceptor(options); // 拦截请求

  return new Promise((resolve, reject) => {
    wx.request({
      ...interceptedOptions,
      success: (res: WechatMiniprogram.RequestSuccessCallbackResult) => {
        const response = responseInterceptor(res); // 拦截响应
        resolve(response);
      },
      fail: (err) => {
        // wx.hideLoading();
        reject(err);  // 请求失败
      },
    });
  });
};

export { request };
